<?php

namespace App\Services;

use Illuminate\Support\Facades\Schema;

class PopularityBasedShardingService
{
    /**
     * 根据热度分数获取表后缀
     */
    public function getTableSuffixByPopularity($likeCount, $commentCount, $viewCount)
    {
        // 计算热度分数（可根据业务调整权重）
        $score = ($likeCount * 3) + ($commentCount * 2) + ($viewCount * 1);
        
        // 根据分数范围确定表
        if ($score >= 1000) return 'hot_1'; // 最热表
        if ($score >= 500) return 'hot_2';
        if ($score >= 200) return 'hot_3';
        if ($score >= 100) return 'hot_4';
        if ($score >= 50) return 'hot_5';
        if ($score >= 20) return 'hot_6';
        if ($score >= 10) return 'hot_7';
        if ($score >= 5) return 'hot_8';
        if ($score >= 1) return 'hot_9';
        return 'hot_10'; // 冷门表
    }
    
    /**
     * 获取所有热度表
     */
    public function getAllHotTables($baseTable)
    {
        $tables = [];
        for ($i = 1; $i <= 10; $i++) {
            $tableName = "{$baseTable}_hot_{$i}";
            //die($tableName);
            if (Schema::hasTable($tableName)) {
                $tables[] = $tableName;
            }
        }
        
        //dd($tables);
        return $tables;
    }
    
    /**
     * 检查表是否存在，如果不存在则使用默认表
     */
    public function getTableWithFallback($baseTable, $suffix)
    {
        $tableName = "{$baseTable}_{$suffix}";
        
        if (Schema::hasTable($tableName)) {
            return $tableName;
        }
        
        // 如果分表不存在，回退到主表
        $this->warn("表 {$tableName} 不存在，使用主表 {$baseTable}");
        return $baseTable;
    }
    
    /**
     * 根据热度范围获取表
     */
    public function getTablesByPopularityRange($baseTable, $minScore = 0, $maxScore = PHP_INT_MAX)
    {
        $allTables = $this->getAllHotTables($baseTable);
        
        // 如果没有热度分表，返回主表
        if (empty($allTables)) {
            return [$baseTable];
        }
        
        $selectedTables = [];
        
        // 简单实现：根据分数范围选择所有可能包含相关数据的表
        if ($maxScore >= 1000 && isset($allTables[0])) $selectedTables[] = $allTables[0];
        if ($maxScore >= 500 && isset($allTables[1])) $selectedTables[] = $allTables[1];
        if ($maxScore >= 200 && isset($allTables[2])) $selectedTables[] = $allTables[2];
        if ($maxScore >= 100 && isset($allTables[3])) $selectedTables[] = $allTables[3];
        if ($maxScore >= 50 && isset($allTables[4])) $selectedTables[] = $allTables[4];
        if ($maxScore >= 20 && isset($allTables[5])) $selectedTables[] = $allTables[5];
        if ($maxScore >= 10 && isset($allTables[6])) $selectedTables[] = $allTables[6];
        if ($maxScore >= 5 && isset($allTables[7])) $selectedTables[] = $allTables[7];
        if ($maxScore >= 1 && isset($allTables[8])) $selectedTables[] = $allTables[8];
        if ($minScore <= 0 && isset($allTables[9])) $selectedTables[] = $allTables[9];
        
        // 如果没有匹配的表，返回所有热度表
        if (empty($selectedTables)) {
            return $allTables;
        }
        
        return array_unique($selectedTables);
    }
}
